IAM JSON Policy
GPT-4.icon
AWS のリソースへのアクセス権限を詳細に制御するためのドキュメントです
JSON形式で記述され、誰が、何を、どこで、どのように使えるかを指定します。
IAMポリシーの基本構造
code:json
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow", // または "Deny"
"Action": "s3:PutObject", // 許可(または禁止)するアクション
"Resource": "arn:aws:s3:::my-bucket/*" // 対象リソース
}
]
}
各項目の意味
Version
現状は常に "2012-10-17" を使用する
Statement
アクセス制御の定義
1つまたは複数のオブジェクトを配列として持てる
Effect
"Allow" または "Deny"
アクセスを許可するか拒否するか
Action
許可または禁止するAPI操作
よくあるミス
例: s3:getObject は正しくない。正しくは s3:GetObject
Resource
ワイルドカードも使える
よくあるミス
間違ったARNを書いている
例:
s3://はNG
arn:aws:s3:::を使う
Condition
(任意)条件に基づいた制御(IP制限、時間制限、タグなど)
e.g.
例: S3バケットの読み取り専用ポリシー
code:json
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
}
]
}
my-bucket の中のオブジェクトに対して、読み取り(s3:GetObject)を許可している
例: 特定のIAMユーザーまたはロールにだけアクセスを許可する
code:json
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::123456789012:user/your-user-name"
},
"Action": "es:ESHttp*",
"Resource": "arn:aws:es:ap-northeast-1:123456789012:domain/your-domain-name/*"
}
]
}
Principal に特定のIAMユーザーを指定。
IP制限ではなく、IAMベースの認証を利用。
IAM Roleでも可(user/xxx を role/xxx に変更)
例: 複数のIAMロールにアクセス許可(例:CI/CDやLambdaなど)
code:json
{
"Effect": "Allow",
"Principal": {
"AWS": [
"arn:aws:iam::111122223333:role/MyLambdaRole",
"arn:aws:iam::444455556666:role/MyECSRole"
]
},
"Action": "es:ESHttpPost",
"Resource": "arn:aws:es:ap-northeast-1:111122223333:domain/my-es-domain/*"
}
複数のロールに POST 操作(データ書き込み)だけを許可。
ESHttpGet なら読み取りのみになる。
クロスアカウントで権限を渡す場合もよく使う形式。
例: VPCエンドポイント経由のみを許可(IAM認証を前提)
code:json
{
"Effect": "Allow",
"Principal": "*",
"Action": "es:*",
"Resource": "arn:aws:es:ap-northeast-1:123456789012:domain/internal-es/*",
"Condition": {
"StringEquals": {
"aws:SourceVpce": "vpce-0123456789abcdef0"
}
}
}
VPC内からのアクセス限定。
vpce-... はVPCエンドポイントのID。
よく使うパターン:社内NWからのアクセスを制限しつつ、IAM認証を使う構成。
例: OpenSearch Dashboards (旧Kibana) 用の閲覧専用ポリシー
code:json
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::123456789012:user/readonly-user"
},
"Action": [
"es:ESHttpGet",
"es:ESHttpHead"
],
"Resource": "arn:aws:es:ap-northeast-1:123456789012:domain/your-domain-name/*"
}
GET と HEAD だけを許可し、データの読み取りに限定。
OpenSearch DashboardsやKibanaで、ログ可視化だけを許可したいときに便利。
例: すべて拒否(セーフティネットとしてのDeny)
code:json
{
"Effect": "Deny",
"Principal": "*",
"Action": "es:*",
"Resource": "*",
"Condition": {
"Bool": {
"aws:SecureTransport": "false"
}
}
}
HTTPS(TLS)を使わないリクエストを全拒否。
すべてのサービスで共通して使えるセキュリティ強化手段。
よく使うアクション
S3:
DynamoDB
dynamodb:GetItem
dynamodb:PutItem
EC2
Lambda
table:_
種類 特徴
インラインポリシー 個別のユーザー/ロール/グループに直接付与。再利用しづらい
マネージドポリシー 複数のエンティティで共有できるポリシー。AWS提供のものもある